home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / Crash & Burn / source code / (Internalized Files) / Development / Libraries / Hubauer / globals.h < prev    next >
Text File  |  1995-11-30  |  4KB  |  210 lines

  1. #ifndef _GLOBALS_
  2. #define _GLOBALS_
  3.  
  4. /****************************************************************
  5.  
  6.     HEADER:        globals
  7.     
  8.     PURPOSE:    For 68K compilers, a register is used to reference
  9.                 global variables.  This header file helps in two
  10.                 ways.
  11.                 
  12.                 1.    We hide the SetA5 stuff using the macros below
  13.                     so that if we compile as a code resource, we
  14.                     can just change the macros and things will be ok
  15.                     for a4 code.
  16.                     
  17.                 2.    Since different compilers use different
  18.                     ways of setting up a4 for code resources, we
  19.                     can hide that here.
  20.                     
  21.     AUTHORS:    Bill Hubauer (BH)
  22.     
  23.     HISTORY:
  24.         WHEN        WHO        WHAT
  25.         ----        ---        ----
  26.         1/95        BH        Created for application support only.
  27.         8/95        BH        Added support for a4
  28.         9/95        BH        Added Symantec Support
  29.         
  30. ****************************************************************/
  31.  
  32. /**
  33.     First, initialize macros  (these defaults are ok for PPC)
  34. **/
  35.  
  36. #undef __G_A5__
  37. #undef __G_A4__
  38. #define SET_GLOBALS(value)
  39. #define GET_GLOBALS() (0)
  40. #define EnterGlobals()
  41. #define ExitGlobals()
  42. #define RememberCallbackGlobals()
  43. #define UseCallbackGlobals()
  44. #define UnuseCallbackGlobals()
  45. /***
  46.     Next, determine the global reference
  47. ***/
  48.  
  49. #ifdef __MWERKS__
  50.     #if __MC68K__
  51.         #if __A5__
  52.             #define __G_A5__
  53.         #else
  54.             #define __G_A4__
  55.         #endif
  56.     #endif
  57. #else
  58. #ifdef __SC__
  59.     #if __A4_GLOBALS__
  60.         #define __G_A4__
  61.     #else
  62.         #define __G_A5__
  63.     #endif
  64. #else
  65. #ifdef THINK_C
  66.     #if __option(a4_globals)
  67.         #define __G_A4__
  68.     #else
  69.         #define __G_A5__
  70.     #endif
  71. #else
  72.     #error unsupported compiler
  73. #endif    /* THINK_C */
  74. #endif    /* __SC__ */
  75. #endif    /* __MWERKS__ */
  76.  
  77.  
  78. /**    Next, we define the macros based on globals type
  79.     remember, that neither of the global types are define
  80.     for power pc
  81. ***/
  82.  
  83. #ifdef __G_A5__
  84.     #undef GET_GLOBALS
  85.     #undef SET_GLOBALS
  86.     #define GET_GLOBALS()        GetA5()
  87.     #define SET_GLOBALS(value)    SetA5(value)
  88. #else
  89. #ifdef __G_A4__
  90.     #undef GET_GLOBALS
  91.     #undef SET_GLOBALS
  92.     #undef EnterGlobals
  93.     #undef ExitGlobals
  94.     #undef RememberCallbackGlobals
  95.     #undef UseCallbackGlobals
  96.     #undef UnuseCallbackGlobals
  97.  
  98.     #define GET_GLOBALS()        _GetA4()
  99.     #define SET_GLOBALS(value)    _SetA4(value)
  100.     #define EnterGlobals()        EnterCodeResource()
  101.     #define ExitGlobals()        ExitCodeResource()
  102.     #define RememberCallbackGlobals()    RememberA4()
  103.     #define UseCallbackGlobals()        long oldA4 = SetUpA4()
  104.     #define UnuseCallbackGlobals()        RestoreA4(oldA4)
  105.  
  106.  
  107. #endif /* a4 */
  108. #endif /* a5 */
  109.  
  110.  
  111. /** now, since _GetA4 , _SetA4 and GetA5 are not standard, we need to define these
  112.     based on compiler
  113. **/
  114.  
  115. #ifdef __MWERKS__
  116.     #if __MC68K__
  117.         #include "AsmHelpers.h"
  118.         #include <a4stuff.h>
  119.         #include <setupa4.h>
  120.     #endif
  121. #else
  122. #ifdef THINK_C
  123.     static long _GetA4()
  124.     {
  125.         asm{
  126.             move.l a4,d0
  127.         }
  128.     }
  129.     
  130.     #define _SetA4(value)        asm{move.l value,a4}
  131.     
  132.     static long GetA5()
  133.     {
  134.         asm{
  135.             move.l a5,d0
  136.         }
  137.     }
  138.     
  139. #else
  140. #ifdef __SC__
  141.  
  142.     #pragma parameter __D0 _GetA4
  143.     static long _GetA4();
  144.  
  145.     #pragma parameter __D0 GetA5
  146.     static long GetA5();
  147.  
  148.     #pragma parameter  _SetA4(__A0)
  149.     static void _SetA4(long value);
  150.  
  151.     static long _GetA4()
  152.     {
  153.         asm(
  154.             0x200C,           //    MOVE.L    A4,D0
  155.             0x4E75              //     RTS
  156.         );
  157.         return 0;
  158.     }
  159.  
  160.     static long GetA5()
  161.     {
  162.         asm(
  163.             0x200D,           //    MOVE.L    A5,D0
  164.             0x4E75              //     RTS
  165.         );
  166.         return 0;
  167.     }
  168.     
  169.  
  170.     static void _SetA4(long value)
  171.     {
  172.         asm(0x2848);    //          MOVE.L    A0,A4
  173.     }
  174.     
  175.  
  176. #endif
  177. #endif
  178. #endif
  179.  
  180.     
  181.  
  182. #ifdef __cplusplus
  183.  
  184.     // AHHHH you can only use this if direct destruction pref is ON
  185.     // otherwise, MW will try to "register" the destructor with
  186.     // the exception manager, which uses globals, before globals are set up.
  187.  
  188. /*
  189. class    EnsureGlobals
  190. {
  191.     public:
  192.         EnsureGlobals(long globals)
  193.         {
  194.             _globals = GET_GLOBALS();
  195.             SET_GLOBALS(globals);
  196.         }
  197.         ~EnsureGlobals()
  198.         {
  199.             SET_GLOBALS(_globals);
  200.         }
  201.     private:
  202.         long    _globals;
  203. };
  204. */
  205.  
  206. #endif
  207.  
  208. #endif
  209.  
  210.